package com.gxxy.spring.kp04_integration.cls02_transaction.s02_annotation;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class TransactionTest {
	
	@Autowired
	private  IAccountService service;
	
	@Test
	public void testTransaction() throws Exception {
		service.transfer(66666L, 88888L, 1000D);
	}
	
}

/* Spring中对各个持久化方案的事务支持: 都是实现了接口PlatformTranscationManager的类
1,JDBC: DataSourceTranscationManager;
2,Hibernate: HibernateTranscationManager;
	* 需要注意的是, 
		1) 如果使用的是HIbernate3那就要使用Hibernate3包中的HibernateTranscationManager
		2) 如果使用的是HIbernate4那就要使用Hibernate3包中的HibernateTranscationManager
3,JPA: JpaTransactionManager;

在接口:PlatformTranscationManager中:
	1,开启事务: TransactionStatus getTransaction();
	2,提交事务: void commit(TransactionStatus status);
	3,回滚事务: void rollback(TransactionStatus status);
*/

/* XML配置事务
* 1, 引入tx命名空间
* 2, 配置一个事务管理器的bean, 在这里我们选择JDBC, 所以使用DataSourceTranscationManager
* 3, 配置事务
* 		1)首先在<aop:config />中配置一个<aop:pointcut/>
* 		2)在<aop:config />同级的地方配置一个<aop:advice />, 表示一个通知
* 			* 这个配置的属性中有两个属性, id和transaction-manager
* 		3)在这个<aop:advice />中配置一个子标签:<tx:attributes />
* 		4)<tx:attributes />中还要配置事务方法属性的子标签:<tx:method />
* 			* 这个标签中有一个name属性, 要你过来配置所有需要拦截方法的规范
* 			* 注意,默认情况下,name属性所填写的都会加上事务, 如果不想添加事务, 必须get/list
* 				则需要再添加一个read-only属性, 设置为true, 那么就不会给这个方法添加事务
* 			* 其他的属性:
* 				1-isolation: 事务的隔离级别
* 					$ 事务的隔离级别(default,read_uncommitted, read_committed,repeatable_read,serializable)
* 					$ 不用不修改, default是使用当前数据库的默认事务隔离级别
* 				2-propagation: 事务的传播方式
* 					$ REQUIRED
* 						如果当前没有事务，就新建一个事务，如果已经存在一个事务中，加入到这个事务中。
* 						这是最常见的选择。
* 					$ REQUIRES_NEW
* 						新建事务，如果当前存在事务，把当前事务挂起。
* 
* 					$ SUPPORTS
* 						支持当前事务，如果当前没有事务，就以非事务方式执行。
* 					$ MANDATORY
* 						使用当前的事务，如果当前没有事务，就抛出异常。
* 					$ NOT_SUPPORTED
* 						以非事务方式执行操作，如果当前存在事务，就把当前事务挂起。
* 					$ NEVER
* 						以非事务方式执行，如果当前存在事务，则抛出异常。
* 					$ NESTED	
* 						如果当前存在事务，则在嵌套事务内执行。
* 						如果当前没有事务，则执行与PROPAGATION_REQUIRED类 似的操作。
* 		5)<aop:pointcut/>中配置一个<aop:advisor />, 表示一个切面
* 			* 其中有两个属性, advice-ref和
* 
*/
